hive源码笔记(1):命令行执行的主流程。

您所在的位置:网站首页 hive 变量 hive源码笔记(1):命令行执行的主流程。

hive源码笔记(1):命令行执行的主流程。

#hive源码笔记(1):命令行执行的主流程。| 来源: 网络整理| 查看: 265

1. ‘hive’命令是(默认为hive跟目录)./bin下的一个shell脚本,依次加载 ./bin/hive-config.sh, ./conf/hive-env.sh,  设置与hadoop、spark、hbase等相关的环境变量、辅助jar文件加载, 依赖的资源的合法性检查, 然后加载 载入./lib/ext目录下的所有被称为“service”的脚本里面定义的shell函数,函数里面就是通过“hadoop jar CLASS arg* ”启动了 根据命令行参数 “--service x”指定的值选择一个service,调用这个service的shell函数以启动hive。不带这个选项时默认是“cli”。 调用hadoop执行对应的service class。 2. cli 这个service的启动。     对应的启动类为 CliDriver的run函数。 public class CliDriver  CliDriver.run   ->OptionsProcessor.process_stage1(args) --初始化hive的配置文件   ->CliSessionState ss = new CliSessionState(new HiveConf(SessionState.class)); --每个命令行中断都是一个session   ->oproc.process_stage2(ss)--初始化命令行选项对应的属性设置   ->SessionState.start(ss);   ->return executeDriver(ss, conf, oproc); ->int cmdProcessStatus = cli.processLine(ss.execString); --"-e"选项执行,最终调用processLine(String line, boolean allowInterrupting) ->return cli.processFile(ss.fileName); -- "-f"选项执行,最终调用 processLine(String line, boolean allowInterrupting) ->reader.addCompleter(completer); --对于交互式的命令行,设置判定一个语句结束的“判定者”。 ->ret = cli.processLine(line, true); -- 遇到一个完整的语句则执行一条语句 processLine(String line, boolean allowInterrupting)   ->oldSignal = Signal.handle(interruptSignal, new SignalHandler() --处理“ctl+c”   ->ret = processCmd(command); ->String[] tokens = tokenizeCmd(cmd_trimmed); --命令行token化 ->if (cmd_trimmed.toLowerCase().equals("quit") || cmd_trimmed.toLowerCase().equals("exit")) --退出 ->if (tokens[0].equalsIgnoreCase("source")) --加载文件  ->cmd_1 = new VariableSubstitution().substitute(ss.getConf(), cmd_1); --替换文件名中的变量,如set,env等  -> ret = processFile(cmd_1); --又回到执行文件了 ->if (cmd_trimmed.startsWith("!")) --执行shell命令 ->else CommandProcessor proc = CommandProcessorFactory.get(tokens, (HiveConf) conf); ret = processLocalCmd(cmd, proc, ss);  ->qp.run(cmd).getResponseCode(); --Driver.run()执行命令行,然后显示结果     public class Driver implements CommandProcessor   public CommandProcessorResponse run(String command, boolean alreadyCompiled) -> CommandProcessorResponse cpr = runInternal(command, alreadyCompiled);  ->HiveDriverRunHookContext hookCOntext= new HiveDriverRunHookContextImpl(conf, command); --hook相关初始化调用  ->private int compileInternal(String command) -> public int compile(String command, boolean resetTaskIds)  ->ParseDriver pd = new ParseDriver(); --语法分析,生成抽象语法书AST  ->ASTNode tree = pd.parse(command, ctx);  ->BaseSemanticAnalyzer sem = SemanticAnalyzerFactory.get(conf, tree); --语义分析,生成逻辑计划  ->sem.analyze(tree, ctx);    ->plan = new QueryPlan(command, sem, perfLogger.getStartTime(PerfLogger.DRIVER_RUN), queryId, SessionState.get().getCommandType());  --生成查询计划 ->if (requiresLock()) ret = acquireLocksAndOpenTxn(); --如果需要一致性,获取锁。默认不需要一致性。 ->ret = execute(); --执行计划 ->return createProcessorResponse(ret);    3. 至于语法分析、语意分析、执行计划,需要后续单独分析。   

From WizNote



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3